package com.faya.green.utils;

import java.io.*;
import java.util.Properties;

/**
 * 用户 ：LX
 * 创建时间： 2018/7/11. 17:06
 * 地点：广州
 * 目的: Properties文件工具类
 * 结果：
 */
public class PropertiesUtil {

    /**
     * 根据key获取 config 下的  config.properties 文件对应的值
     * @param key 需要查找的key
     * @return 返回对应的value
     */
    public static String getConfigValue(String key){
        return getPath(key, PathUtil.getConfigPath());
    }

    /**
     * 根据key 获取 properties 文件 中key相对应的value的值
     * @param key properties文件中的key
     * @param filePath 要读取的 properties 文件路径，如：E:\kaiFa\IDEATest\greenSource\target\classes\config\config.properties
     * @return 返回对应的值，没有或异常返回null
     */
    public static String getPath(String key, String filePath){
        FileInputStream fileInputStream = null;
        //Properties类继承自Hashtable类并且实现了Map接口，也是使用一种键值对的形式来保存属性集。不过Properties有特殊的地方，就是它的键和值都是字符串类型
        Properties properties = new Properties();
        String val = "";

        try {
            //以文件流形式读取文件
            fileInputStream = new FileInputStream(new File(filePath));
            //可以从.properties属性文件对应的文件输入流中，加载属性列表到Properties类对象
            properties.load(fileInputStream);
            //根据Key获取值
            val = properties.getProperty(key);

        } catch (FileNotFoundException e) {
            e.printStackTrace();
            return null;
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fileInputStream != null){
                try {
                    fileInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

        }
        if (val == null || "".equals(val)){
            return null;
        }
        return val;
    }


    /**
     * 根据key 获取 properties 文件 中key相对应的value的值（针对中文的读取）
     * @param key properties文件中的key
     * @param filePath 要读取的 properties 文件路径，如：E:\kaiFa\IDEATest\greenSource\target\classes\config\config.properties
     * @return 返回对应的值，没有或异常返回null
     */
    public static String getChineseValue(String key, String filePath){
        FileInputStream fileInputStream = null;
        //Properties类继承自Hashtable类并且实现了Map接口，也是使用一种键值对的形式来保存属性集。不过Properties有特殊的地方，就是它的键和值都是字符串类型
        Properties properties = new Properties();
        String val = "";

        try {
            //以文件流形式读取文件
            fileInputStream = new FileInputStream(new File(filePath));
            //可以从.properties属性文件对应的文件输入流中，加载属性列表到Properties类对象
            properties.load(fileInputStream);
            //根据Key获取值
            val = properties.getProperty(key);
            if (val != null){
                val = new String(val.getBytes("ISO-8859-1"), "utf-8");
            }

        } catch (FileNotFoundException e) {
            e.printStackTrace();
            return null;
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fileInputStream != null){
                try {
                    fileInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

        }
        if (val == null || "".equals(val)){
            return null;
        }
        return val;
    }

    /**
     * 添加数据到 Properties 文件中（注意，数据是添加在部署的位置，而不是在项目中，且添加的文件如果修改后缀为xml，会有不同）
     * @param key 添加的数据的key值
     * @param value 添加的数据的value
     * @param notes 添加的注释（可选）
     * @param filePath 要读取的 properties 文件路径，如：E:\kaiFa\IDEATest\greenSource\target\classes\config\config.properties
     */
    public static void setSave(String key,String value,String notes, String filePath){
        FileOutputStream fileOutputStream = null;
        Properties properties = new Properties();
        try {
            //文件输出流获取到文件 true表示追加打开
            fileOutputStream = new FileOutputStream(new File(filePath), true);
            //将传入的值写入
            properties.setProperty(key, value);

            try {
                //保存到输出流中并添加注释 等价于保存
                properties.store(fileOutputStream, notes);
            } catch (IOException e) {
                e.printStackTrace();
            }

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } finally {
            if (fileOutputStream != null){
                try {
                    fileOutputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

        }
    }

    /**
     * 更新properties文件的键值对
     * 如果该主键已经存在，更新该主键的值；
     * 如果该主键不存在，则插件一对键值。
     * @param keyname 键名
     * @param keyvalue 键值
     * @param filePath 要读取的 properties 文件路径，如：E:\kaiFa\IDEATest\greenSource\target\classes\config\config.properties
     */
    public static void updateProperties(String keyname,String keyvalue, String filePath) {
        Properties props = new Properties();
        try {
            props.load(new FileInputStream(filePath));
            // 调用 Hashtable 的方法 put，使用 getProperty 方法提供并行性。
            // 强制要求为属性的键和值使用字符串。返回值是 Hashtable 调用 put 的结果。
            OutputStream fos = new FileOutputStream(filePath);
            props.setProperty(keyname, keyvalue);
            // 以适合使用 load 方法加载到 Properties 表中的格式，
            // 将此 Properties 表中的属性列表（键和元素对）写入输出流
            props.store(fos, keyname);

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
